﻿using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;

namespace DiNinject.EfModel
{
    public class ModelContainer : IModelContainer
    {
        #region Konstruktor
        public ModelContainer(IConnectionInfo connectionInfo)
        {
            EFModelContainer = new EFModelContainer(GetConnectionString("EFModel", GetSqlBuilder(connectionInfo)));
        }
        #endregion

        #region Member
        public EFModelContainer EFModelContainer { get; protected set; }
        #endregion

        #region private Functions
        /// <summary>
        /// Gibt den Connectionstring zur DB zurück für das EntityFramework
        /// </summary>
        /// <param name="modelName">Der Name des Models, damit wir den MetaData String passend zusammenbauen können.</param>
        private string GetConnectionString(string modelName, SqlConnectionStringBuilder sqlConnectionStringBuilder)
        {
            //Initialize the EntityConnectionStringBuilder.
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();

            //Providernamen setzten
            entityBuilder.Provider = "System.Data.SqlClient";
            //Connectionstring setzten
            entityBuilder.ProviderConnectionString = sqlConnectionStringBuilder.ToString();
            //Metadaten setzten.
            entityBuilder.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", modelName);
            return entityBuilder.ConnectionString;
        }

        /// <summary>
        /// Gibt den ConnectionstringBuilder für "normale" SQL Connections zurück
        /// </summary>
        private SqlConnectionStringBuilder GetSqlBuilder(IConnectionInfo connectionInfo)
        {
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
            //Die Zugangsdaten aus der Web.Config laden, nicht den Connectionstring verwenden.
            sqlBuilder.DataSource = connectionInfo.DataSource;
            sqlBuilder.InitialCatalog = connectionInfo.InitialCatalog;
            sqlBuilder.UserID = connectionInfo.UserID;
            sqlBuilder.Password = connectionInfo.Password;
            //Wichtige Option damit mehrere Abfragen geöffnet werden können 
            //um Subabfragen ausführen zu können von Untergordneten Projekten
            sqlBuilder.MultipleActiveResultSets = true;
            sqlBuilder.IntegratedSecurity = false;
            sqlBuilder.ApplicationName = "DiNinject"; //Dient zur Identifizierung der DB Connection/Application wenn man z.B: Fehler auf dem DB Server sucht.
            return sqlBuilder;
        }
        #endregion
    }
}
